import { Subscriber } from "./Subscriber";
import { pipeFromArray } from "./util/pipe";

// subject可以有多个观察者
// observable也可以有多个观察者
// 都可以多播放，但是subject它所有的观察者得到数据是同一份，而observable不 同的观察者得到的数据不一样
export class Observable {
  constructor(subscribe) {
    if (subscribe) {
      //保存订阅函数,在创建实例的时候subscribe函数并没有执行
      this._subscribe = subscribe;
    }
  }
  //当调用Observable的subscribe方法的时候，就要开始执行_subscribe
  subscribe(observerOrNext) {
    //subscribe逻辑1. 创建一个订阅者的对象
    // new Subscriber(observerOrNext);， 再包一层，就是为了实现其他逻辑，比如取消订阅
    const subscriber = new Subscriber(observerOrNext);
    //subscribe逻辑2. 订阅函数执行后会返回一个销毁函数，执行订阅者的对象的next error complete 方法
    const teardown = this._subscribe(subscriber);
    //把销毁函数存放到subscriber
    subscriber.add(teardown);
    return subscriber;
  }

  /**
   * 管道
   * @param  {...any} operations 操作符 map((val) => val * 2) ，操作符执行后，例如map() 返回的函数 (source) => {...};
   * @returns
   */
  pipe(...operations) {
    // this 老的观察对象
    //把老的Observable传递给operation的source参数
    //return operation(this);
    return pipeFromArray(operations)(this);
  }
}
